perm filename MPX.MIC[MPX,SYS] blob
sn#699497 filedate 1983-02-26 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00002 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 SET SPT=20000 SPECIAL PAGES TABLE BEGINS AT 20000
C00020 ENDMK
C⊗;
SET SPT=20000 ;SPECIAL PAGES TABLE BEGINS AT 20000
LOC 0
;GET HERE ON POWER-ON RESET, I/O BUS RESET AND CONO RESET
;RESET_COND IS SET IF I/O BUS RESET OR POWER-ON RESET BUT IS IGNORED
;BY THIS VERSION OF THE MICROCODE. IT CAN BE CLEARED BY A SUCCESSFUL
;BRANCH ON RESET_COND.
ZAP:
;WE NEED TO CLEAR ALL VBIT ENTRIES AND ALL MAP ENB ENTRIES
AR,BR=0/SPEC=5 ;GET CONTROL OF SEL BUS, ETC
;-AR[10-12] → -SEL BUS, AR[13-15] → PADR [20-22]
RSWAIT: JUMPIF ~MEM_DONE RSWAIT ;WAIT UNTIL WE GET CONTROL
RSVLUP: ~SEL_BUS_REG=¬<AR←-3,7>/SPEC=13
;-SEL BUS←-AR[10-12], CLEAR MCYC MEM DONE
MA_HI=<AR←4,7←4> ;MA HI[20-22]←AR[13-15]
VBIT=0 ;CLEAR 16 VBIT ENTRIES, FOR DEVICE WHOSE
;# IS IN SEL BUS FOR PGS MA HI[20-22]=0,1...
<AR> JUMPIF MASK[0] RSL1;DON'T CLEAR MAP ENB IF AR BIT 0 IS ON
MAP_ENB=0 ;CLEAR MAP ENB BIT FOR DEVICE WHOSE # IS IN LOW
;3 BITS OF AR
RSL1: AR=≡000101+AR ;INCREMENT AR[10-15] AND [4-9]
<AR←3> JUMPIF ~MASK[0] RSVLUP
;IF AR[3] IS OFF, THERE IS MORE TO DO
AR=0/SPEC=4 ;RELEASE CONTROL OF SEL BUS, ETC. CLEAR CYC IN PROG
CLRBSY: BR=0/SPEC=10 ;CLEAR MIOBC BUSY
IDLE: JUMPIF MICRQ_RQ_SYNC MICRQ ;BRANCHING CLEARS MICRQ RQ SYNC
JUMPIF MIOBC_BUSY IOBUSY ;BRANCHING CLOCKS MS FROM I
JUMPIF TRUE IDLE
;GET HERE ON DATAO MPX OR CONO MPX BITS 22, 23, 30, 31
;MS HAS BEEN LOADED WITH THE I/O BUS DATA EXCEPT FOR BIT 1 WHICH IS
;0 FOR CONO AND 1 FOR DATAO
IOBUSY: <MS[0_3]←13.> JUMPIF ~MASK[0] CONO
;JUMP IF MS[1] IS CLEAR (I.E. CONO)
<MS[0_3]←12.> JUMPIF ~MASK[0] LDPTP
;JUMP IF MS[0] IS CLEAR (I.E. LOAD PAGE TABLE
;POINTER)
;GET HERE ON DATAO TO LOAD MICROCODE. THE PAGE NUMBER OF THE CORE PAGE THAT
;CONTAINS THE MICROCODE IS IN MS[23-35]
MA_HI=<MS[20_35]> ;LOAD UP HI PART OF ADDRESS OF MICROCODE
BR=0 ;BR → LO PART OF ADDRESS OF MICROCODE
AR=≡40 ;MICROSTORE ADDRESS TO WRITE IN NEXT
MLDLP: MA_LO=BR/SPEC=6 ;GET CONTROL OF SEL BUS, ETC. AND BEGIN READ CYC
MLRWT: JUMPIF ~MEM_DONE MLRWT ;WAIT UNTIL THE CYCLE IS FINISHED
BR=<BR>+1/SPEC=3 ;WRITE MS INTO MICROSTORE AT ADDRESS POINTED TO
;BY AR. COUNT BR TO NEXT MEM ADDRESS.
/SPEC=13 ;CLEAR MCYC MEM DONE
AR=<AR>+1/SPEC=4 ;COUNT MICROSTORE ADDRESS AND RELEASE SEL BUS, ETC.
JUMPIF MICRO_RPE MLPAR
<AR←7> JUMPIF ~MASK[0] MLDLP
;THERE IS MORE TO DO UNLESS AR[7] IS CARRIED INTO
JUMPIF TRUE CLRBSY ;DONE, CLEAR MIOBC BUSY AND FALL INTO IDLE LOOP
MLPAR: /SPEC=12 ;SET MPXERR PAR ERR AND GIVE UP
JUMPIF TRUE CLRBSY
;ALL CODE BETWEEN THE TOP OF THE PAGE AND HERE GOES IN THE ROM.
;THAT'S 29 WORDS FOLKS, WE MADE IT!!
LOC 40
;GET HERE ON DATAO WITH I/O BUS BIT 0 OFF. BUS BITS 15-17 ARE THE DEVICE
;WHOSE PAGE TABLE POINTER WE WISH TO SET AND BITS 23-35 ARE THE 13 BITS
;PAGE TABLE POINTER (PAGE NUMBER)
LDPTP: AR=<MS[4_19]←-2,17> ;LOAD LOW 4 AR BITS WITH DEVICE CODE
~PTPNT=¬<MS[20_35]> ;WRITE ¬MS[23-35] INTO ¬PTPNT(AR)
JUMPIF TRUE CLRBSY ;CLEAR MIOBC BUSY AND FALL INTO IDLE LOOP
CONO: <MS[20_35]←11.> JUMPIF MASK[0] ENBMAP
;JUMP IF MS[31] IS SET (I.E. CONO ENABLE MAPPING)
<MS[20_35]←10.> JUMPIF MASK[0] CLRMAP
;JUMP IF MS[30] IS SET (I.E. CONO CLEAR MAPPING)
;GET HERE FOR CONO RESET DEVICE WHOSE NUMBER IS IN MS[24-26]
AR=<MS[20_35]←-9,7> ;DEVICE TO RESET (FROM MS[24-26])
BR,MAP_ENB=0 ;CLEAR MAP ENABLE FOR THE SPECIFIED DEVICE
AR=<AR←3,7←3,BR>/SPEC=5 ;GET CONTROL OF SEL BUS, ETC. SET AR 10-12 TO
;DEVICE CODE SPECIFIED IN MS[24-26]
AR=≡107000∨AR ;COUNT OUT AFTER ONE DEVICE, BIT 0 USED AS FLAG
;TO AVOID CLEARING MAP ENB
JUMPIF TRUE RSWAIT ;GO RESET THE VALID BITS FOR THIS DEVICE
;GET HERE TO CLEAR OR SET THE MAP ENB BIT FOR DEVICE WHOSE NUMBER
;IS IN MS[24-26]
CLRMAP:
ENBMAP: AR=<MS[20_35]←-9,7> ;AR GETS DEVICE CODE FROM MS[24-26]
MAP_ENB=<MS[20_35]←-4,1>;STORE APPROPRIATE BIT (MS[31]) IN MAP ENB(AR)
;1 FOR ENABLE MAPPING AND 0 FOR DISABLE MAPPING
JUMPIF TRUE CLRBSY ;CLEAR MIOBC BUSY AND FALL INTO IDLE LOOP
;GET HERE WHEN SOME DEVICE REQUESTS A MAPPED CYCLE FOR WHICH THERE IS NO
;VALID INFORMATION IN THE MAPPING RAMS
MICRQ: ~SEL_BUS_REG=¬<MICRQ_SEL←-4,7>/SPEC=14
;SET SEL BUS REG FROM MICRQ SEL 4,2,1
;CLEAR REQUESTING DEVICE'S MICRQ
MA_HI=<PTPNT> ;HI ORDER PART OF MA COMES FROM PAGE TABLE POINTER
;FOR READING, PTPNT IS ADDRESSED BY MICRQ SEL 4,2,1
MA_LO=<PADR_MICRO←-7,777>/SPEC=6
;LO ORDER PART OF MA COMES FROM VIRT PAGE NUMBER
;GET CONTROL OF SEL BUS, ETC AND DO READ CYCLE
BR=<~VBIT_NEW_BIT> ;ACTIVE LOW BIT TO BE ORED INTO THIS VBIT WORD
AR=<PADR_MICRO,3←14.> ;INITIALIZE AR FOR STORING INTO MAPRAM.
;START WITH PADR MICRO 18-19 IN HIGH TWO BITS
MRQWT: JUMPIF ~MEM_DONE MRQWT ;WAIT UNTIL WE HAVE CONTROL AND THE WORD IS READ
MA_HI=<PADR_MICRO←-7,177>/SPEC=13
;MAHI[20-26]←PADR_MICRO[20-26] AND CLEAR MEM DONE
JUMPIF MICRO_RPE PTPAR ;JUMP IF PARITY ERROR IN READING PAGE TABLE
;BRANCHING CLEARS MPXERR MICRO RD PAR ERR
VBIT=¬(<~VBIT,,BR>∧BR) ;THAT'S LIKE VBIT=VBIT∨¬BR. VBIT IS ADDRESSED
;BY SEL BUS 4,2,1 AND PADR 20-22.
BR=0
AR=¬<MS[0_3]←13.,1←13.,AR>
;OR IN WRITE ACCESS BIT (MS[3]) AND
;COMPLEMENT IT AND SECT 18-19
<MS[0_3],3←2,BR> JUMPIF ~MASKIS0 NOTPRV
;JUMP IF MS[0-1] NON-ZERO, I.E. NOT A PRIV PAGE
ABIT=<MS[0_3]←-1> ;STORE ACCESS BIT (MS[2]) IN THE ABIT RAM
MAPSTR: <MS[4_19],17←2,BR> JUMPIF ~MASKIS0 NINCOR
;JUMP IF MS[14-17] NON-ZERO, I.E. NOT IN CORE
MAPRAM=<MS[20_35],17777,AR>/SPEC=7
;MASK IN THE MAPPED PAGE NUMBER (MS[23-35]) AND
;STORE IT, THE WRITE ACCESS BIT AND SECT 18-19
;IN THE MAPPING RAM (IT AND ABIT ARE ADDRESSED
;BY SEL BUS 4,2,1 AND PADR 20-26.
;CLEAR STARTED BIT FOR DEVICE IN MICRQ SEL LATCH
MAPXIT: /SPEC=4 ;RELEASE CONTROL OF SEL BUS, ETC.
JUMPIF TRUE IDLE/SPEC=1 ;RELEASE MICRQ SEL LATCH
;GET HERE IF A PARITY ERROR OCCURRED READING A PAGE TABLE WORD
PTPAR: /SPEC=11 ;SET PT PAR ERR FOR DEVICE IN MICRQ SEL 4,2,1
/SPEC=4 ;RELEASE CONTROL OF SEL BUS, ETC.
JUMPIF TRUE IDLE/SPEC=1 ;RELEASE MICRQ SEL LATCH. THE STARTED LATCH FOR
;THIS DEVICE IS STILL SET, INHIBITING IT FROM
;BEING SEEN FOR FUTURE REQUESTS. RESETTING THE
;DEVICE WILL CLEAR ITS STARTED LATCH.
;GET HERE WHEN BITS 14-17 OF THE PAGE TABLE ENTRY ARE NON-ZERO, INDICATING
;THAT THE PAGE IS NOT IN CORE
NINCOR: ABIT=0/SPEC=7 ;SET ACCESS BIT IN ABIT RAM TO ZERO. WILL GET
;ACCESS VIOLATION WHEN THIS CYCLE HAPPENS AGAIN
;CLEAR STARTED BIT FOR DEVICE IN MICRQ SEL LATCH
JUMPIF TRUE MAPXIT
;GET HERE WHEN THE PAGE TABLE ENTRY (IN MS) IS NOT A PRIVATE PAGE TYPE.
;BITS MS[0-1] ARE NON-ZERO. 0 1 INDICATES A SHARED PAGE, 1 0 INDICATES
;AN INDIRECT PAGE. 1 1 IS UNDEFINED.
NOTPRV: AR=¬<MS[4_19]←-7>/SPEC=4
;AR(15) ← ¬ MS[12], THE ACCESS PERMIT BIT
;RELEASE SEL BUS, ETC.
AR=<MS[0_3]←13.,1←13.,AR>
;AR(2) ← MS[3], THE WRITE PERMIT BIT
;****NOTE BR WAS SET ZERO EARLIER****
BR=<MS[4_19]←7,77←7,BR> ;BR(3-8) ← MS[14-19]
BR=<MS[20_35]←-9,177,BR>
;BR(9-15) ← MS[20-26]
BR=≡SPT+BR ;THIS IS THE ADDRESS WE WANT TO READ IN THE SPT
MA_LO=BR ;MA_LO=BR(7-15)=MS[18-26]
<MS[0_3]←12.> JUMPIF MASK[0] NOTSHR
;JUMP IF MS[0] IS ON, I.E. NOT SHARED
MA_HI=<BR←-9,177,BR>/SPEC=6
;MA_HI=BR(0-6), BEGIN READ CYCLE
SHRWAT: JUMPIF ~MEM_DONE SHRWAT ;WAIT UNTIL WE GET THE SPT ENTRY
MA_HI=<PADR_MICRO←-7,177>/SPEC=13
;MAHI[20-26]←PADR_MICRO[20-26] AND CLEAR MEM DONE
JUMPIF MICRO_RPE NPRPAR ;JUMP IF GOT PARITY ERROR WHILE READING SPT
AR=¬<PADR_MICRO,3←14.,AR>
;AR(0-1) ← ¬ PADR MICRO 18-19
;AR(2) ← ¬ WRITE PERMIT
;AR(15) ← ACCESS BIT
ABIT=AR ;STORE ACCESS BIT IN ABIT RAM
BR=0
JUMPIF TRUE MAPSTR ;GO STORE MAPRAM AND EXIT
;GET HERE IF WE GOT PARITY ERROR WHILE READING SPECIAL PAGE TABLE ENTRY
;VBIT HAS BEEN TURNED ON, MUST BE TURNED OFF AND PT PAR ERR MUST BE SET
;FOR THE DEVICE IN MICRQ SEL 4,2,1.
NPRPAR: BR=¬<~VBIT_NEW_BIT> ;THIS IS THE BIT TO TURN OFF IN VBIT
VBIT=¬(<~VBIT,,BR>∨BR) ;THAT'S LIKE VBIT∧¬BR
JUMPIF TRUE PTPAR
;GET HERE WHEN THE PAGE TABLE ENTRY (IN MS) IS NOT PRIVATE OR SHARED.
;MS[0] IS A ONE. MS[1] SHOULD BE ZERO FOR AN INDIRECT PAGE TABLE ENTRY.
;MS[1] BEING A ONE IS ILLEGAL AND WILL CAUSE A PAGE NOT IN CORE TYPE TRAP.
NOTSHR: <MS[0_3]←13.> JUMPIF ~MASK[0] NINCOR
;JUMP IF MS[1] IS ON, I.E. MS[0-1] = 11
MA_HI=<BR←-9,177,BR> ;MA_HI=BR(0-6)
BR=<MS[20_35]>/SPEC=6 ;BR = MS[27-35] = PAGE NUMBER TO LOOK UP
;IN NEW PAGE TABLE. BEGIN READ CYCLE.
NSHWAT: JUMPIF ~MEM_DONE NSHWAT
MA_HI=<PADR_MICRO←-7,177>/SPEC=13
;MAHI[20-26]←PADR_MICRO[20-26] AND CLEAR MEM DONE
JUMPIF MICRO_RPE NPRPAR ;JUMP IF GOT PARITY ERROR WHILE READING SPT
MA_LO=<BR>/SPEC=4 ;PAGE NUMBER TO LOOK AT IN NEW PAGE TABLE
;RELEASE CONTROL OF SEL BUS, ETC.
BR=0
<MS[4_19],17←2,BR> JUMPIF ~MASKIS0 NINCOR
;JUMP IF SPT ENTRY POINTS TO PAGE TABLE NOT IN CORE
MA_HI=<MS[20_35]>/SPEC=6
;MAHI = MS[23-35] = PAGE NUMBER OF NEW PAGE TABLE
;BEGIN READ CYCLE
NSHWA1: JUMPIF ~MEM_DONE NSHWA1
MA_HI=<PADR_MICRO←-7,177>/SPEC=13
;MAHI[20-26]←PADR_MICRO[20-26] AND CLEAR MEM DONE
JUMPIF MICRO_RPE NPRPAR ;JUMP IF GOT PARITY ERROR WHILE READING INDIR ENTRY
END